package keter.combofs.api;

import keter.combofs.model.ComboFile;
import keter.combofs.model.FileMeta;

import java.io.IOException;
import java.io.InputStream;

/**
 * 统一文件系统
 */
public interface ComboFs {

    /**
     * 根据文件ID获取文件对象
     * @param id
     * @return
     */
    ComboFile getComboFile(Long id) throws IOException;

    /**
     * 根据文件地址（不包含存储的文件系统根目录或存储桶）获取文件对象
     * @param  fileUri 文件地址
     * @return
     */
    ComboFile getComboFile(String fileUri) throws IOException;

    /**
     * 根据文件ID直接获取文件流：性能最好
     * @param id
     * @return
     * @throws IOException
     */
    byte[] getBytes(Long id) throws IOException;

    /**
     * 根据文件地址直接获取文件流：性能最好
     * @param fileUri
     * @return
     * @throws IOException
     */
    byte[] getBytes(String fileUri) throws IOException;

    /**
     * 直接保存文件
     * @param b 文件字节数组
     * @return
     * @throws IOException
     */
    ComboFile save(byte[] b) throws IOException;

    ComboFile save(InputStream in) throws IOException;

    /**
     * 使用FileUri保存文件
     * @param b
     * @param fileUri
     * @return
     * @throws IOException
     */
    void save(byte[] b, String fileUri) throws IOException;

    void save(InputStream in, String fileUri) throws IOException;

    /**
     * 包含元数据保存文件
     * @param b
     * @param fileMeta
     * @return
     * @throws IOException
     */
    ComboFile save(byte[] b, FileMeta fileMeta) throws IOException;

    ComboFile save(byte[] b, String fileUri, FileMeta fileMeta) throws IOException;

    /**
     * 文件删除
     * @param id
     * @return 成功标识
     */
    boolean delete(Long id);

    boolean delete(String fileUri);
}
